// es2017 :

const obj = {
    foo: 'value1',
    bar: 'value2'
}

// 1 . Object.values :获取对象值以数组形式返回
console.log(Object.keys(obj)); // [ 'foo', 'bar' ]
console.log(Object.values(obj)); //  [ 'value1', 'value2' ]

// 2 . Object.entries()：获取对象键值对为数组，以数组返回
console.log(Object.entries(obj)); //[ [ 'foo', 'value1' ], [ 'bar', 'value2' ] ]
for (let [key, value] of Object.entries(obj)) {
    console.log(key, value); //foo value1
}
// 与Map参数契合（嵌套数组类型数据）
console.log(new Map(Object.entries(obj))); //Map(2) { 'foo' => 'value1', 'bar' => 'value2' }


// 3 . Object.getOwnPropertyDescriptors() :用来获取一个对象的自身所有属性描述

const p1 = {
    firstName: '小罗布特',
    lastName: '唐尼',
    get sayName() { //指针属性
        return this.firstName + '  ' + this.lastName
    }
}

console.log(p1); //{ firstName: '小罗布特', lastName: '唐尼', sayName: [Getter] }
console.log(p1.sayName); //小罗布特  唐尼
// Object.assgin({创建一个空对象},拷贝对象) ：浅拷贝自身可枚举属性
const p2 = Object.assign({}, p1)
p2.lastName = '林肯' //赋值的是可枚举属性，实际sayName指针属性为改变
console.log(p2); //{ firstName: '小罗布特', lastName: '林肯', sayName: '小罗布特  唐尼' }
// Object.getOwnPropertyDescriptors():深拷贝，获取自身所有的属性描述
const p3 = Object.getOwnPropertyDescriptors(p1)
console.log('p3', p3);
console.log('sayname', p3.sayName);
// Object.defineProperties():定义或修改一个对象的属性：
const p4 = Object.defineProperties({}, p3)
p4.lastName = '邓肯'
console.log('p4', p4); //p4 { firstName: '小罗布特', lastName: '邓肯', sayName: [Getter] }
console.log(p4.sayName); //小罗布特  邓肯

// 4 . String.prototype.padStart(填充长度,填充样式) /String.prototype.padEnd（填充长度，填充样式）:字符串格式化

const obj_str = {
    name: 'deman',
    age: 20,
    dec: 'this is boy!'
}

/** 
 * name------,deman
 * age-------,00020
 * dec-------,this is boy!
 */
for (let [key, value] of Object.entries(obj_str)) {
    console.log(`${key.padEnd(10,'-')},${value.toString().padStart(5,0)}`);
}


//  5. 在函数参数中添加尾逗号
// function(a,b,){}
// const ob ={a:100,b:200,}
// const arr = [100,200,]

// 6 . 添加async /await 为Promise的语法糖